package com.sakiko.aspects;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

// todo: aop_03
@Component
@Aspect
public class MsgAspect {

    // 提取切点表达式 1、定义方法 public void 方法名(){} 2、添加注解 @Pointcut("切点表达式") 3、@Before("指定方法名")等注解中使用
    // 推荐把所有 pointcut写到同一个组件中管理 见 pointcuts.MyPointcut
//    @Pointcut("execution(* com.sakiko.aop_03.*.*(..))")
//    public void pointcut(){
//
//    }

    // todo: 引入
    @Before("com.sakiko.pointcuts.MyPointcut.pointcut()") /*("execution(* com.sakiko.aop_03.*.*(..))")*/
    public void before() {
        System.out.println("业务之前...");
    }

    @AfterReturning("com.sakiko.pointcuts.MyPointcut.pointcut()") /*("execution(* com.sakiko.aop_03.*.*(..))")*/
    public void afterReturning() {
        System.out.println("afterReturning");
    }

    @AfterThrowing("com.sakiko.pointcuts.MyPointcut.pointcut()") /*("execution(* com.sakiko.aop_03.*.*(..))")*/
    public void afterThrowing() {
        System.out.println("afterThrowing");
    }

    @After("com.sakiko.pointcuts.MyPointcut.pointcut()") /*("execution(* com.sakiko.aop_03.*.*(..))")*/
    public void after() {
        System.out.println("业务之后...");
    }
}

/*
练习:
1、查询某包某类下，访问修饰符是公有，返回值是int的全部方法
    execution(public int x.x.x.x.XxxClassName.*(..))
2、查询某包下类中第一个参数是String的方法
    execution(* x.x.x.x.*.*(String,..))
3、查询全部包下，无参数的方法
    execution(* *..*.*())
4、查询com包下，以int参数类型结尾的方法
    execution(* com..*.*(..,int))
5、查询指定包下，Service开头类的私有 返回值int的无参数方法
    execution(private int x.x.x.x.Service*.*())
 */
